home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cli / SED.lha / SED / SED.doc < prev    next >
Text File  |  2000-10-15  |  18KB  |  466 lines

  1. Amiga SED    An Amiga Stream Editor © THOR-Software (Thomas Richter)
  2. ______________________________________________________________________________
  3.  
  4. Purpose of this program:
  5.  
  6.     SED takes an input file, checks each line of this file against a
  7.     pattern supplied on the command line, and generates a new line from
  8.     this pattern match in the destination. This could either mean that
  9.     the matching line is removed completely from the output, replaced
  10.     by a different line, or changed according to the specifications of
  11.     SED.
  12.     
  13.     SED is an approximation of the Unix "stream editor" sed. It is not
  14.     quite as powerful as sed because its command set is currently very
  15.     limited, and it does not support command files. Its pattern syntax
  16.     is different, too. It still looks like "line noise" to me - I didn't
  17.     want to break with this tradition - but it's at least the Amiga kind
  18.     of line noise.
  19.  
  20.     Its pattern matching rules are a superset of the AmigaOs patterns,
  21.     with some additional features like "captured expressions" and more
  22.     powerful "character classes" and "escaping".
  23.  
  24.     SED is useful for automatic processing of text files, e.g. the modi-
  25.     fication of the startup-sequence. SED can also be run as a "filter"
  26.     in which case it reads its input from stdin and prints output to
  27.     stdout. Combine this feature with pipes and you get a very powerful
  28.     text processing tool.
  29.  
  30.     A warning: Pattern matching looks simple, but is full of hard to gasp
  31.     traps. This tool is therefore thought to be for "expert usage". In 
  32.     case you think SED doesn't process your pattern correctly, think
  33.     twice!
  34.  
  35. ______________________________________________________________________________
  36.  
  37. SYNOPSIS:
  38.  
  39. SED    FROM,TO,MATCH/A,REPLACE,CHANGE,DELETE/S,USECASE/S,ALL/S,VERBOSE/S
  40.  
  41. FROM        An (AmigaOs) pattern specifying the input file(s) to process.
  42.         If not given, SED reads from the standard input.
  43.  
  44. TO        The output file where to write the processed lines to. If not
  45.         given, SED writes to the standard output.
  46.  
  47. MATCH        A pattern specification used for filtering the input lines.
  48.         More on the pattern rules below.
  49.         
  50.  
  51. The next options specify what to do with the lines matching the pattern:
  52.  
  53.  
  54. REPLACE        Replace matching lines in the input by this replace rule, do
  55.         not write non-matching lines to the output. The replacement
  56.         rules are given below.
  57.  
  58. CHANGE        Replace matching lines by the replace rule given by this ex-
  59.         presson. In contrast to REPLACE, non-matching lines are placed
  60.         in the destination without change. Useful for modifying a file
  61.         according to a pattern rule.
  62.  
  63. DELETE        Print all lines except those matching the pattern. This
  64.         effectively removes the matching lines from the input file.
  65.  
  66. USECASE        Be case-sensitive. By default, SED is case-insensitive.
  67.         Note that SED differs in this detail from the Un*x sed.
  68.  
  69. ALL        In case the FROM pattern is a wildcard, enter sub-directories
  70.         recursively.
  71.  
  72. VERBOSE        Print information about the file currently scanned, and upon
  73.         entering a directory. By default, SED is quiet.
  74.         Note that "Search" is by default not quiet.
  75. ______________________________________________________________________________
  76.  
  77. Pattern specification:
  78.  
  79.     In the following, the syntax of the patterns is specified. By good
  80.     tradition, this is in-comprehensively.
  81.  
  82.     I present first a "quick and dirty" presentation of the available
  83.     patterns as a quick reference which might give you an impression about
  84.     the possibilities. It is all but sufficient to work with SED. Then, a
  85.     detailed and more precise, but also more confusing presentation
  86.     follows.
  87.  
  88. ______________________________________________________________________________
  89.  
  90. Quick guide to patterns:
  91.  
  92. SED patterns work much like Amiga patterns. Unlike in "Search", a pattern is
  93. applied to a FULL line, and not to sub-strings of this line. Which means that
  94. the pattern "hello" matches ONLY the line containing the single word "hello",
  95. nothing more. If you want to match lines containing "hello", use "#?hello#?"
  96. instead - see below for what "#?" means. Unlike Un*x sed, there are no special
  97. characters to match the start or the end of a line. They are not required in
  98. the SED approach.
  99.  
  100. Standard patterns:
  101.  
  102. ?        Matches a single arbitrary character. 
  103. #        Matches zero or more repetitions of the following symbol in
  104.         the AmigaOs sense. Note that # may match zero(!) characters
  105.         as well.
  106.         Therefore, #? matches an arbitrary sequence of at least zero
  107.         characters, hence any string.
  108. +        Matches one or more repetitions of the following symbol
  109.         New to AmigaOs, standard Un*x regular expression.
  110. *        Matches zero or more arbitrary characters in the sense of
  111.         MS-DOS. Note that this is a functional difference to Un*x
  112.         regular expressions where * has the meaning of #.
  113.  
  114.         Note that you need to write ** instead of * if you enclose
  115.         the pattern in double quotes on the shell command line. This
  116.         is because * is also the BCPL escape character. Messy.
  117.  
  118. (...)        Groups the characters in the bracket to a single symbol.
  119.         As for example, #(ab) would match an arbitrary repetition
  120.         of "ab", as the empty string, "ab", "abab" or "ababab", but
  121.         not "aba". 
  122.         Brackets can be nested.
  123.  
  124. (..|..)        The vertical bar means "or". Matches either the left or the
  125.         right string. The bar is only valid within brackets.
  126.  
  127. {...}        Groups expressions much like (...) but captures the contents
  128.         of the sub string that matched the brackets. This captured
  129.         expression is then available for the ouput replacement rules,
  130.         see below for more information. For example,
  131.  
  132.         SED MATCH {#?}.c REPLACE {1}.o
  133.  
  134.         would match all lines ending on ".c", and would capture the
  135.         string in front of the ".c". The "{1}" in the replace pattern
  136.         would insert this string, and would append an ".o". 
  137.         Namely, the above replaces all lines ending on ".c" by a 
  138.         similar line ending by ".o".
  139.         Works very much line the Un*x \(..\) matching.
  140.  
  141. {..|..}        The vertical bar works right the same way here as described
  142.         above. Matches either the left or the right expression, and
  143.         captures the expression that fits.
  144.  
  145. %        Matches the empty string. Useful for patterns like 
  146.         "#?(.c|.o|%)" which could be used to match the source, the
  147.         object code and the final executable of a C project, for
  148.         example.
  149.  
  150. ~        Means "not" and matches all symbols that do not match the
  151.         following symbol. Be warned, ~ is full of traps, see below
  152.         for the full description.
  153.  
  154. [..]        Character classes. Matches a single character on a range of
  155.         valid characters specified in the interior of the bracket.
  156.         For example, "[ac]" would match the single character "a" or
  157.         "c". 
  158.  
  159. [..|..]        Matches either the left or the right character range. Hence,
  160.         [a|c] is equivalent to [ac].
  161.  
  162. [..,..]        Another equivalent formulation of the above. [a,c] is the same
  163.         as [ac] or [a|c].
  164.  
  165. [..-..]        Matches a character range. [a-z] matches all letters - except
  166.         language specific "Umlaute", though, which have different en-
  167.         codings. Several ranges can be grouped much the same way as
  168.         single characters. [a-z|0-9] means "any character or any digit"
  169.         but nothing else.
  170.  
  171. [-..]        Matches all characters up to the specified character. Hence,
  172.         [-z] means "all characters up to z". Note that unlike in Un*x
  173.         implementations, there are no messy rules concering the "["
  174.         itself as character. The escape character "\" must be used to
  175.         specify "[" or "]" itself, see below. 
  176.         This syntax can be combined freely with "|" or "," to specify
  177.         more than one range.
  178.  
  179. [..-]        Matches all characters starting at the given ASCII value. Can 
  180.         be combined freely with "," and "|". There are no messy rules
  181.         concerning "-" in the middle or the end of a character range,
  182.         proper escaping must be used if "]" should be matched.
  183.         [a-] matches therefore all characters "a" and up.
  184.  
  185. [~..]        Matches all characters not in the following range. ~ is applied
  186.         up to the next "|" or ",", unlike in the standard AmigaOs (Arp)
  187.         expression matching. Therefore,
  188.         [~ab] matches all characters except "a" and "b" and is
  189.         equivalent to [~a,~b] and [~a|~b].
  190.  
  191. \        Escape character. Specifies a character to be matched:
  192.  
  193.         \t    Tabulator        \v    Vertical TAB
  194.         \b    Backspace        \r    CR
  195.         \f    Form Feed        \a    Bell
  196.         \n    is INVALID since the end of the line is matched
  197.             by the end of the pattern itself.
  198.         \x..    The character encoded by the hex value following
  199.             the "x". In case this specification is ambigious,
  200.             the number might be terminated by a dot ".". 
  201.             Hence, "\x9.0" matches a tabulator sign and the
  202.             digit "0", whereas "\x90" matches the ASCII char-
  203.             acter of the code hex 90.
  204.             Note that this rule differs from the ANSI-C rule.
  205.         \0..    The character of the ASCII code encoded as an
  206.             octal number.
  207.             The dot is used as above as separator, unlike in
  208.             ANSI-C.
  209.         \$..    Identical to \x.., matches the digit encoded by
  210.             the ASCII code in hex.
  211.         \d    Matches the dollar sign since \$ has a different
  212.             meaning already.
  213.         \#..    Matches the character encoded by the ASCII code
  214.             in decimal notation.
  215.         \h    Matches the hash-mark since \# has a different
  216.             meaning already.
  217.         
  218.         Everything else: The character following the backslash
  219.         itself. Especially, \\ is the backslash itself and \" is
  220.         the double quote.
  221.  
  222.         Note that you must use the backslash to match characters
  223.         which are otherwise part of the pattern syntax, as for
  224.         example "\(" to match the bracket. Note that "#" and "$"
  225.         are special in this sense since "\$" and "\#" are used
  226.         to specify characters by ASCII code.
  227.  
  228. !,",§,$,&,=
  229. -,^,',`,<,>    are reserved for future use AND MUST NOT be used at all.
  230.         Escape them if you need them. However, the dot (".") is
  231.         free, unlike Un*x regexp, same goes for "@" and "/".
  232.  
  233. ..        Everything else: Matches the character itself. Hence "a"
  234.         matches a single "a" much like "[a]".
  235.  
  236. ______________________________________________________________________________
  237.  
  238. Replacement rules:
  239.  
  240. The arguments of REPLACE and CHANGE specify what do with the lines which
  241. matched the specified pattern. Unlike the pattern specification, only the
  242. special operators \ and {..} are allowed. All other operators from the
  243. above list are forbidden and generate an error.
  244.  
  245. \        Escape character, works identically to the \ in the pattern
  246.         and places the single character encoded by the sequence
  247.         following the backslash on the output directly.
  248.  
  249. {..}        Specifies a captured expression to be inserted into the
  250.         output stream. The brackets take up to three arguments:
  251.         The couting number of the regular expression, and optionally
  252.         two arguments how to format the regular expression separated
  253.         by a dot ".". These numbers work very much the same way like
  254.         the arguments to the %s format specifier in ANSI-C.
  255.         
  256.         The first number in the bracket describes which captured
  257.         expression to insert. If it is a positive number, the number
  258.         is simply the index of the captured expression, counting from
  259.         one upwards. 
  260.  
  261.         Each opening bracket "{" in the input pattern starts a new 
  262.         captured expression, hence in nested expressions the other-
  263.         most bracket has the lowest index.
  264.  
  265.         If this number is negative, it counts the captured ex-
  266.         pressions downwards from the last expression.
  267.  
  268.         If the specified expression does not exist, the brackets
  269.         expand into an empty string that is formatted according to
  270.         the rules given by the next three arguments.
  271.  
  272.         {1}    is the first captured expression,
  273.         {3}    is the third expression,
  274.         {-1}    is the last expression,
  275.         {-2}    is the second to last expression.
  276.  
  277.  
  278.         The next number is the field with to print the captured ex-
  279.         pression in. At least the specified number of characters are
  280.         printed, or more if the expression is longer. If the ex-
  281.         pression is too short, the field is padded with blank spaces.
  282.         The expression is right-justified into this field, unless
  283.         the field width is negative in which case the expression is
  284.         left-justified. The sign of the field width is otherwise
  285.         ignored.
  286.         Defaults to 0, i.e. the field is always as small as possible.
  287.  
  288.         The last number is the size limit of the expression. The
  289.         expression will be cut down if it is longer than the specified
  290.         limit. SED will cut the end of the string if this argument is
  291.         positive, or the start of the string if it is negative. The
  292.         sign of the limit is otherwise ignored.
  293.         If the limit is 0, which is the default, the expression will
  294.         not be cut down at all.
  295.  
  296.         {1.10}    is the first captured expression right justified in
  297.             a field of ten characters or longer.
  298.  
  299.         {2.-5.7}is the second captured expression, left justified in
  300.             a field of five characters. At most seven characters
  301.             of the expression will be printed.
  302.  
  303. ..        Everything else: The character itself is printed on the ouput.
  304.  
  305. ______________________________________________________________________________
  306.  
  307. Detailed pattern matching rules:
  308.  
  309. And now for the detailed rules to confuse you completely:
  310.  
  311. - A SYMBOL is either a single character, one of the following operators 
  312. followed by its arguments, a character class [..] or a (..) or {..} sequence.
  313.  
  314. - A PATTERN is a sequence of SYMBOLs.
  315.  
  316. - The POSTFIX of a symbol in a pattern is the subsequence of the pattern
  317. following the symbol, not including the argument of the symbol itself.
  318.  
  319. ?        Matches a single character except the end of a string.
  320.  
  321. #        Matches as many repetitions of the following symbol, but
  322.         at least zero such that the postfix of the symbol matches 
  323.         the postfix of the input.
  324.         Hence, "#" is greedy. There is currently no non-greedy form.
  325.  
  326. +        Matches as many repetitions of the following symbol but
  327.         at least one such that the postfix of the symbol matches the
  328.         postfix of the input. "+" is greedy.
  329.  
  330. *        is fully equivalent to "#?" and therefore greedy.
  331.  
  332. (...)        groups the pattern up to the next | or ) into a symbol
  333.         which matches if the contents of the brackets match.
  334.  
  335. (..|..)        An or-combined symbol matches if one of the expressions
  336.         in the bracket match such that the postfix symbol matches 
  337.         the postfix of the input.
  338.  
  339. {...},{..|..}    Similar to the above except that the matched string is
  340.         captured.
  341.  
  342. %        Is completely ignored as pattern and gobbles no character
  343.         from the input sequence at all. 
  344.  
  345. ~        Matches the longest subsequence or at least zero characters
  346.         that does not match the following symbol such that the 
  347.         postfix of the symbol still matches the postfix of the input. 
  348.         "~" is greedy and will try to match as many characters first.
  349.  
  350.         Note that a symbol could either be a single character or a
  351.         sequence of characters grouped by () or #. Since a single
  352.         character cannot match a string larger or smaller than one
  353.         character, ~ followed by a one-character symbol will match
  354.         all subsequences except those whose postfix either don't
  355.         match the postfix of the character, or which match the
  356.         character and the postfix.
  357.  
  358.         This is *very* tricky and you should think about the con-
  359.         sequences of this rule twice. More examples below.
  360.  
  361. [..]        Character classes. Groups a range of characters into a
  362.         symbol that matches exactly a single character, but never
  363.         the empty string.
  364.  
  365.         ~ in character classes is special: If there is a not-sequence
  366.         in a character class, it matches if all not sequence match at
  367.         once and one of the normal sequences match. Hence
  368.  
  369.         [~p,~q,a-z]
  370.  
  371.         matches all letters except p and q.
  372.  
  373. ..        Everything else matches exactly the the one character that
  374.         it represents. They will not match the empty string.
  375.  
  376. ______________________________________________________________________________
  377.  
  378. Some examples of patterns to think of:
  379.  
  380. %        Matches only empty lines in the input.
  381.  
  382. ~%        Matches only non-empty lines in the input.
  383.  
  384. #?.c        Matches all lines ending on ".c"
  385.  
  386. The#?        Matches all lines starting with "The".
  387.  
  388. #?Example#?    Matches all lines containing the word "Example".
  389.  
  390. Example#?    Matches all lines starting with the word "Example".
  391.  
  392. Example        Matches all lines consisting of the single word "Example".
  393.  
  394. #?        Matches all lines.
  395.  
  396. #?(.c|.o|%)    Matches all lines (think about why!).
  397.  
  398. foo(.c|.o|%)    Matches all lines consisting entirely of the word "foo", "foo.c"
  399.         or "foo.o".
  400.  
  401. foo(.c|.o|)    Just the same.
  402.  
  403. ~(Example)    Matches all lines except the line consisting of the single word
  404.         "Example".
  405.  
  406. ~(#?Example#?)    Matches all lines that do not contain the word "Example".
  407.  
  408. ~(ab)cd        Matches all lines that do not start with "ab" and that end on 
  409.         "cd". Especially, this would match "bccd". It would also match
  410.         the line "cd" since "ab" does not match the empty sequence in
  411.         front of "cd". (think about this!)
  412.  
  413. ~#a.c        Matches all lines ending by ".c" except those where the ".c" is
  414.         prefixed by an arbitrary number of a's, including zero a's.
  415.         Hence, it would match "bc.c" and even "ab.c", but not "a.c" or
  416.         ".c" as the last consists of zero a's and one ".c". It would
  417.         not match "bc.o". This is identically to ~(#a).c since # binds
  418.         the following a.
  419.  
  420. ~(#ab)#?    Matches all lines except those starting with a possibly empty
  421.         sequence of a's followed by a single b. Hence, does not match
  422.         aaabccc or bccc.
  423.  
  424. ~(#[ ,\t];)#?    Matches all lines except those starting with a possibly empty
  425.         sequence of blanks or tabulators followed by a colon. Hence,
  426.         for a shell script, this would match all non-comment lines.
  427.  
  428. ~(#[ ,\t];)if#?    This is a tricky one. Unlike what you might think, this does
  429.         not match all non-comment lines starting with if. It also
  430.         matches lines starting with a semicolon provided the string
  431.         "if" is in the line and not directly behind the semicolon.
  432.         Note that this is the intended behaivour. For example, it
  433.         would match 
  434.  
  435.         ;aifb
  436.  
  437.         The reason is simple: This is a string ";a" that does not
  438.         match the symbol #[ ,\t]; followed by "ifb" which matches
  439.         if#?.
  440.  
  441.         What you want here instead is #[ ,\t]if#? which matches
  442.         all if-lines with additional, at least zero, blanks or tabs 
  443.         in front.
  444.  
  445.         The above example shows again the tricky nature of pattern
  446.         matching.
  447.  
  448. A real life example would be
  449.  
  450. sed from S:Startup-Sequence match "{#[ ,\t]}RunBack{#?}" change "{1}Launch{2}"
  451.  
  452. which would replace all invocations of "RunBack" in the Startup-Sequence by
  453. similar invocations of "Launch".
  454.  
  455. Another example to think about as exercise:
  456.  
  457. ({}|{#[~;]+[ \t]}#[~; \t][/:]|{}#[~; \t][/:]|{#[~;]+[ \t]})FooBar{|[ \t;]#?}
  458.  
  459. Yes, this pattern is useful. Consider again S:Startup-Sequence as input file
  460. and think about what this could possibly do. Note that some expressions are
  461. captured. (Hey, I said this would look like line noise!)
  462. ______________________________________________________________________________
  463.  
  464. Thomas Richter,
  465.         October 2000
  466.